package magchess10.rn.jogada;

import java.util.LinkedList;
import java.util.List;

import magchess10.rn.pecas.Movimentos;
import magchess10.rn.tabuleiro.Casa;

public class Trajetoria {

	private final List<Casa> casasTrajetoria = new LinkedList<Casa>();

	private int tipoTrajetoria;

	public Trajetoria(JogadaBase jogada) {

		defineTipoTrajetoria(jogada);
		defineCasasTrajetoria(jogada);

	}

	private void defineCasasTrajetoria(JogadaBase jogada) {


		if (tipoTrajetoria == Movimentos.INVALIDO)
			return;
		
		Casa casaInicial = jogada.getCasaInicial();
		Casa casaFinal = jogada.getCasaFinal();

		casasTrajetoria.add(casaInicial);

		if (tipoTrajetoria == Movimentos.CAVALO || casaInicial == null)
			return;

		int deltaColuna = getDelta(casaInicial.getColuna(), casaFinal
				.getColuna());
		int deltaLinha = getDelta(casaInicial.getLinha(), casaFinal.getLinha());

		Casa casaAuxiliar = casaInicial.somaClonando(deltaLinha, deltaColuna);

		while (!casaAuxiliar.equals(casaFinal)) {
			casasTrajetoria.add(casaAuxiliar);
			casaAuxiliar = casaAuxiliar.somaClonando(deltaLinha, deltaColuna);
		}

	}

	private int getDelta(int valorInicial, int valorFinal) {
		if (valorInicial == valorFinal)
			return 0;
		return (valorFinal - valorInicial)
				/ Math.abs((valorFinal - valorInicial));
	}

	private final void defineTipoTrajetoria(JogadaBase jogada) {

		tipoTrajetoria = jogada.isJogadaRepositorio() ? Movimentos.REPOSITORIO
				: Movimentos.ehCavalo(jogada) ? Movimentos.CAVALO : Movimentos
						.ehDiagonal(jogada) ? Movimentos.DIAGONAL :
						Movimentos.ehVertical(jogada) ?	Movimentos.VERTICALHORIZONTAL : Movimentos.INVALIDO;

	}

	public final List<Casa> getCasasTrajetoria() {
		return casasTrajetoria;
	}

	public final int getTipoTrajetoria() {
		return tipoTrajetoria;
	}
	
	public boolean checkCasaInTrajetoria (Casa casa) {
		return casasTrajetoria.contains(casa);
	}

}
